#include "../../include/test/winTest.hpp"

using namespace SoftEngine;
using namespace DirectX;

// 每个demo都是有以下步骤，新建相机，构建物体,物体变换，投影，画出画面，其中新建相机和构建物体属于初始化步骤。
// 这是第一个demo的初始化步骤

Camera test1Camera;
DotMatrix newRectangle;
vector<XMFLOAT2> planeDot;
vector<Mesh> planeMesh;

void InitDemo1(HWND hWnd){
    test1Camera=generateCamera2();
    newRectangle=AnalysisModel();
    planeMesh=newRectangle.mesh;
}
//会在这绘制一次
void ProcessDemo1(HDC hdc){
    DotPerspective dotPerspective(test1Camera);
    // 绕着x,y,z轴旋转
    newRectangle.handleDotMatrix1(XMFLOAT3(0.0f,0.0f,1.0f));
    planeDot=dotPerspective.projectRectangle(newRectangle.vertex);
    Drawer::drawMesh(planeDot,planeMesh,hdc);
}


// 窗口过程函数
LRESULT CALLBACK WndProc(HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam)
{
    switch (message)
    {
    // 首次显示的时候
    // 调用InvalidateRect(),updateWindow()的时候
    // 大小改变
    //从被覆盖恢复为可见。
    case WM_PAINT:{
        // 绘图代码写在这里
        PAINTSTRUCT ps;
        auto hdc = BeginPaint(hWnd, &ps);
        ProcessDemo1(hdc);
        EndPaint(hWnd, &ps);
        break;
    }
    // 使用了setTimer之后就会一直循环收到这个消息
    case WM_TIMER:
        InvalidateRect(hWnd, NULL, TRUE);
        break;
    case WM_DESTROY:
        PostQuitMessage(0);
        break;
    default:
        return DefWindowProc(hWnd, message, wParam, lParam);
    }

    return 0;
}

int APIENTRY WinMain(HINSTANCE hInst, HINSTANCE hInstPrev, PSTR cmdline, int cmdshow)
{
    static TCHAR szWindowClass[] = _T("DesktopApp");
    static TCHAR szTitle[] = _T("Windows Desktop Guided Tour13 Application");

    // 注册窗口类
    WNDCLASSEX wcex;
    wcex.cbSize = sizeof(WNDCLASSEX);
    wcex.style = CS_HREDRAW | CS_VREDRAW;
    wcex.lpfnWndProc = WndProc;
    wcex.cbClsExtra = 0;
    wcex.cbWndExtra = 0;
    wcex.hInstance = hInst;
    wcex.hIcon = LoadIcon(hInst, IDI_APPLICATION);
    wcex.hCursor = LoadCursor(NULL, IDC_ARROW);
    wcex.hbrBackground = (HBRUSH)(COLOR_WINDOW + 1);
    wcex.lpszMenuName = NULL;
    wcex.lpszClassName = szWindowClass;
    wcex.hIconSm = LoadIcon(wcex.hInstance, IDI_APPLICATION);

    // 注册失败
    if (!RegisterClassEx(&wcex))
    {
        // 弹出一个警告框
        MessageBox(NULL,
            "Call to RegisterClassEx failed!",
            "Windows Desktop Guided Tour11",MB_OK); // <--- 修改这里，传递适当的警告类型
        return 1;
    }

    // 创建一个窗口，并返回一个句柄
    HWND hWnd = CreateWindowEx(WS_EX_OVERLAPPEDWINDOW, szWindowClass, szTitle, WS_OVERLAPPEDWINDOW, CW_USEDEFAULT, CW_USEDEFAULT, 1000, 600, NULL, NULL, hInst, NULL);
    if (!hWnd)
    {
        // 弹出一个警告框
        MessageBox(NULL,
            "Call to CreateWindowEx failed!",
            "Windows Desktop Guided Tour12",
            MB_OK);
        return 1;
    }
    // 初始化demo
    InitDemo1(hWnd);
    SetTimer(hWnd, 1, 16, NULL);
    // 展示这个窗口，并且参数是cmdshow，决定了运行代码的时候，窗口的初始状态，经验可知在windows中，有些应用双击之后就是最大窗口，单击就不是
    ShowWindow(hWnd, cmdshow);
    // 系统立即发送信息重新绘制一次，如果不使用，就会导致等到WM_PAINT消息传递进来才会重新绘制。看起来似乎卡了一样。
    UpdateWindow(hWnd);
    MSG msg;
    // 循环监听
    while (GetMessage(&msg, NULL, 0, 0))
    {
        // 如果得到消息，将底层的键盘消息转为字符串消息
        TranslateMessage(&msg);
        // 分发消息
        DispatchMessage(&msg);
    }
    KillTimer(hWnd,1);

    return (int)msg.wParam;
}